
#ifndef __GPIO_H__ 
#define __GPIO_H__

#include "stm32f10x.h"

//			Mode
#define GPIO_IN							0
#define GPIO_OUT_10M					1
#define GPIO_OUT_2M						2
#define GPIO_OUT_50M					3

//Config
//			In input mode (MODE[1:0]=00):
#define GA								0		//00: Analog mode
#define GF								1		//01: Floating input (reset state)
#define GP								2		//10: Input with pull-up / pull-down
												//11: Reserved
//			In output mode (MODE[1:0] > 00):
#define GPP								0		//00: General purpose output push-pull
#define GOD								1		//01: General purpose output Open-drain
#define APP								2		//10: Alternate function output Push-pull
#define AOD								3		//11: Alternate function output Open-drain

#define gpio_clear(num)					(~(0x0f << ((num & 0x7) << 2)))
#define gpio_init(num, mode, config)	(((uint32_t)mode | (config << 2)) << ((num & 0x7) << 2))

//GPIOA->CRL = 	gpio_init(0,  GPIO_IN, GA)

/*
	GPIOA->CRL = 	gpio_init(0,  GPIO_IN,  GA)  	| gpio_init(1,	GPIO_IN,  GA)  		| \
					gpio_init(2,  GPIO_IN,  GA)  	| gpio_init(3,  GPIO_IN,  GA)  		| \
					gpio_init(4,  GPIO_IN,  GF)  	| gpio_init(5,  GPIO_IN,  GF)  		| \
					gpio_init(6,  GPIO_IN,  GF)  	| gpio_init(7,  GPIO_IN,  GF);

	GPIOA->CRH = 	gpio_init(8,  GPIO_OUT_2M, GPP) | gpio_init(9,  GPIO_OUT_2M, APP)	| \
					gpio_init(10, GPIO_IN,  GF)  	| gpio_init(11, GPIO_IN,  GF)  		| \
					gpio_init(12, GPIO_IN,  GF)  	| gpio_init(13, GPIO_IN,  GA)  		| \
					gpio_init(14, GPIO_IN,  GA)  	| gpio_init(15, GPIO_OUT_2M, GOD);

	GPIOB->CRL = 	gpio_init(0,  GPIO_IN,  GF)  	| gpio_init(1,	GPIO_IN,  GF)  		| \
					gpio_init(2,  GPIO_IN,  GF)  	| gpio_init(3,  GPIO_IN,  GA)  		| \
					gpio_init(4,  GPIO_IN,  GF)  	| gpio_init(5,  GPIO_IN,  GF)  		| \
					gpio_init(6,  GPIO_IN,  GF)  	| gpio_init(7,  GPIO_IN,  GF);

	GPIOB->CRH = 	gpio_init(8,  GPIO_OUT_2M, GPP) | gpio_init(9,  GPIO_OUT_2M, APP)	| \
					gpio_init(10, GPIO_IN,  GF)  	| gpio_init(11, GPIO_IN,  GF)  		| \
					gpio_init(12, GPIO_IN,  GF)  	| gpio_init(13, GPIO_IN,  GA)  		| \
					gpio_init(14, GPIO_IN,  GA)  	| gpio_init(15, GPIO_OUT_2M, GOD);
*/

#endif // __GPIO_H__
